package com.pan.operation.dyproxy.cglib;


import net.sf.cglib.core.DebuggingClassWriter;
import net.sf.cglib.proxy.Callback;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.InvocationHandler;
import java.lang.reflect.Method;


/**
 *
 *
 * Enhancer.setCallbacks(Callback[])设置多个callback时，必须设置CallbackFilter来确保一个代理类只能接受一个拦截。
 * 如果未设置，会报错：java.lang.IllegalStateException: Multiple callback types possible but no filter specified
 */
public class BossCglibTest {

    public static void main(String[] args) {
        //将生成的子类，保存在硬盘
        System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "D:\\tmp");
        //1创建目标对象
        final BossCglib bossCglib=new BossCglib();
        //2创建代理对象
        //2.1创建增强器对象
        Enhancer e=new Enhancer();
        //2.2设置增强器的类加载器
        e.setClassLoader(bossCglib.getClass().getClassLoader());
        //2.3设置代理对象父类类型
        e.setSuperclass(bossCglib.getClass());
        //2.4设置回调函数
        e.setCallback(new InvocationHandler() {

            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("开始事务。。。");
                Object obj = method.invoke(bossCglib, args);
                System.out.println("结束事务。。。");
                return obj;
            }
        });
//        Callback[] callbacks = new Callback[2];
//        InvocationHandler a1 =new InvocationHandler() {
//            @Override
//            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//                System.out.println("开始事务。。。");
//                Object obj = method.invoke(bossCglib, args);
//                System.out.println("结束事务。。。");
//                return obj;
//            }
//        };
//
//        InvocationHandler a2 =new InvocationHandler() {
//            @Override
//            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//                System.out.println("开始记录日志。。。");
//                Object obj = method.invoke(bossCglib, args);
//                System.out.println("结束记录日志。。。");
//                return obj;
//            }
//        };
//        callbacks[0]=a1;
//        callbacks[1]=a2;
//        e.setCallbacks(callbacks);
        //2.5创建代理对象
        BossCglib proxy =(BossCglib) e.create();

        //3.执行代理对象业务
        proxy.work();
        proxy.drive();
    }
}
